﻿using System;
using System.Collections.Generic;
using System.Linq;
using GigaSite.Domain.Entities;
using GigaSite.Domain.Interfaces.Repositories;

namespace GigaSite.Domain.DAL.Repositories
{
    /// <summary>
    /// СУБД реализация репозитория товаров
    /// </summary>
    public class GoodsRepository: BaseRepository<Good>, IGoodsRepository
    {
        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="dataContext">Контекст доступа к данным</param>
        public GoodsRepository(GigaDataContext dataContext) : base(dataContext)
        {
        }

        /// <summary>
        /// Загружает указанную сущность по ее идентификатору
        /// </summary>
        /// <param name="id">Идентификатор сущности</param>
        /// <returns>Сущность с указанным идентификатором или Null</returns>
        public override Good Load(long id)
        {
            return Find(g => g.Id == id);
        }

        /// <summary>
        /// Получает все товары, находящиеся в указанной категории
        /// </summary>
        /// <param name="category">Категория</param>
        /// <returns>Коллекция товаров</returns>
        public IEnumerable<Good> GetGoodsInCategory(Category category)
        {
            return category.GoodToCategoryMappings.Select(m => m.Good);
        }

        /// <summary>
        /// Устанавливает категории, в которых находится данный товар
        /// </summary>
        /// <param name="good">Товар</param>
        /// <param name="categories">Коллекция категорий</param>
        public void SetGoodCategories(Good good, IEnumerable<Category> categories)
        {
            // Ищем категории связь с которыми нужно удалить
            var categoriesToDelete = good.GoodToCategoryMappings.Where(m => !categories.Any(category => category.Id == m.CategoryId));

            // Ищем категории связь с которыми нужно добавить
            var categoriesToAdd = categories.Where(category => !good.GoodToCategoryMappings.Any(mapping => mapping.CategoryId == category.Id));

            // Выполняем действия
            DataContext.GoodToCategoryMappings.DeleteAllOnSubmit(categoriesToDelete);
            DataContext.GoodToCategoryMappings.InsertAllOnSubmit(categoriesToAdd.Select(category => new GoodToCategoryMapping()
            {
                Good = good,
                Category = category,
                DateCreated = DateTime.Now
            }));

            // Сохраняем изменения в БД
            SubmitChanges();
        }
    }
}